#define BLINKER_MIOT_LIGHT
#define BLINKER_WIFI

#include <Blinker.h>
char auth[] = "aa4f66577664";
//char ssid[] = "你的wifi ssid";
//char pswd[] = "wifi 密码";

// 新建组件对象
BlinkerButton ButtonOn("btn-on");//按键的名称 开灯
void smartConfig()//配网函数
{
  WiFi.mode(WIFI_STA);//使用wifi的STA模式
  Serial.println("\r\nWait for Smartconfig...");//串口打印
  digitalWrite(LED_BUILTIN, HIGH);
  WiFi.beginSmartConfig();//等待手机端发出的名称与密码
  //死循环，等待获取到wifi名称和密码
  while (1)
  {
    //等待过程中一秒打印一个.
    Serial.print(".");
    delay(1000);                                             
    if (WiFi.smartConfigDone())//获取到之后退出等待
    {
      Serial.println("SmartConfig Success");
      //打印获取到的wifi名称和密码
      Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());
      Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
      break;
    }
  }
}

int count=0;
bool WIFI_Status = true;
void WIFI_Init()
{
    Serial.println("\r\n正在连接");
    //当设备没有联网的情况下，执行下面的操作
    while(WiFi.status()!=WL_CONNECTED)
    {
        if(WIFI_Status)//WIFI_Status为真,尝试使用flash里面的信息去 连接路由器
        {
            Serial.print(".");
            delay(1000);                                        
            count++;
            if(count>=30)
            {
                WIFI_Status = false;
                Serial.println("WiFi连接失败，请用手机进行配网"); 
            }
        }
        else//使用flash中的信息去连接wifi失败，执行
        {
            smartConfig();  //smartConfig技术配网
        }
     }  
     //串口打印连接成功的IP地址
     Serial.println("连接成功");  
     Serial.print("IP:");
     Serial.println(WiFi.localIP());
}
int counter = 0;
int GPIO=2;//定义GPIO口用于控制继电器
// 按下按键即会执行该函数
void button1_callback(const String & state) {
  if (state == "on") {
    BLINKER_LOG("get button state: 开灯");
    Blinker.print("switch", "on");
    digitalWrite(GPIO, LOW);
    delay(200);
    ButtonOn.print("on");
  }

  if (state == "off") {
    BLINKER_LOG("get button state: 关灯");
    digitalWrite(GPIO, HIGH);
    delay(200);
     // 反馈开关状态
     ButtonOn.print("off");
  }
  Blinker.vibrate(); 
}

// 如果未绑定的组件被触发，则会执行其中内容
void dataRead(const String & data)
{
  BLINKER_LOG("Blinker readString: ", data);
  counter++;
}


void miotPowerState(const String & state)
{
    BLINKER_LOG("need set power state: ",state);

    if (state == BLINKER_CMD_OFF) {//如果语音接收到是关闭灯就设置GPIO口为高电平
        digitalWrite(GPIO, HIGH);
        BlinkerMIOT.powerState("off");
        BlinkerMIOT.print();
    }
    else if (state == BLINKER_CMD_ON) {
        digitalWrite(GPIO, LOW);
        BlinkerMIOT.powerState("on");
        BlinkerMIOT.print();
    }
}


void setup() {
  // 初始化串口
  Serial.begin(115200);
  pinMode(GPIO,OUTPUT);
  digitalWrite(GPIO,HIGH);//初始化，由于继电器是低电平触发。所以刚开始设为高电平
  BLINKER_DEBUG.stream(Serial);
  BLINKER_DEBUG.debugAll();
  // 初始化有LED的IO
 pinMode(LED_BUILTIN, OUTPUT);
//digitalWrite(LED_BUILTIN, HIGH);
  // 初始化blinker
  WIFI_Init();//调用WIFI函数
    Blinker.begin(auth, WiFi.SSID().c_str(), WiFi.psk().c_str());//运行blinker
  Blinker.attachData(dataRead);
  ButtonOn.attach(button1_callback);
  BlinkerMIOT.attachPowerState(miotPowerState);//这段代码一定要加，不加小爱同学控制不了,务必在回调函数中反馈该控制状态
}

void loop() {
  Blinker.run();
 //   digitalWrite(LED_BUILTIN, LOW);   // Turn the LED on (Note that LOW is the voltage level
  // but actually the LED is on; this is because
  // it is active low on the ESP-01)
 // delay(1000);                      // Wait for a second
 // digitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGH
 // delay(2000);
}
